#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-
##
# Procesamos un fichero con el siguiente formato: 
## |        tn        | title                           | queue_id | state_id | create_time         |
## | 2010080210123456 | Welcome to OTRS!                |        1 |        1 | 2012-06-07 13:24:34 |
## | 2010080210123456 | Welcome to OTRS!                |        2 |        1 | 2012-08-14 15:12:59 |
## | 2010080210123456 | Welcome to OTRS!                |        2 |        1 | 2012-08-14 15:13:47 |
## | 2010080210123456 | Welcome to OTRS!                |        2 |        1 | 2012-08-14 15:15:05 |
## | 2010080210123456 | Welcome to OTRS!                |        2 |        4 | 2012-08-14 15:16:11 |
## | 2012060810000013 | preuba campos                   |        2 |        4 | 2012-06-08 13:30:06 |
## | 2012060810000013 | preuba campos                   |        2 |        4 | 2012-08-01 16:05:59 |
## | 2012060810000013 | preuba campos                   |        2 |        4 | 2012-08-01 16:06:31 |
## | 2012060810000022 | preuba campos                   |        2 |        4 | 2012-06-08 13:30:44 |
## | 2012060810000022 | preuba campos                   |        2 |        4 | 2012-06-08 14:53:59 |
## | 2012060810000022 | preuba campos                   |        2 |        4 | 2012-06-15 16:57:38 |
##
##
# cada linea es un registro (cambio de estado, cambio de cola) de un ticket. Un ticket tiene varias entradas en el fichero.
# Con este script se ve cuanto tiempo ha pasado el ticket en cada cola.

import time;
import datetime;
import sys;


class Registro:
        def __init__(self,tn,title,queue,state,time,colas):
                self.tn=tn;
                self.title=title;
                self.queue=int(float(queue));
                self.state=state;
                self.time=time;
                self.pendiente(colas);

        def __init__(self,linea,colas):
                tmp=linea.split("|");
                self.tn=tmp[1].strip();
                self.title=tmp[2].strip();
                self.queue=int(float(tmp[3].strip()));
                self.state=tmp[4].strip();
                self.time=tmp[5].strip();
                self.pendiente(colas);

        def imprime(self):
                print self.tn, self.title, self.queue, self.state, self.time;

        def timetoseconds(self):
                 return time.mktime(time.strptime(self.time,'%Y-%m-%d %H:%M:%S'));

        def pendiente(self,colas):
                if self.state=="6":
                        self.queue=colas.index("Pendiente");

class Ticket:
        def __init__(self,colas):
                self.colas=colas;
                self.registros=[];
                self.tiempos={};
                for i in range (len(self.colas)):
                        self.tiempos[i]=0;
                self.estados=['None', 'None', 'Cerrado exitosamente', 'Cerrado sin exito', 'Abierto', 'None', 'Pendiente proveedor', 'Pendiente auto close +', 'Pendiente auto close -', 'Mezclado', 'Cerrado provisional', 'Prefranqueado'];

        def append(self, registro):
                self.registros.append(registro);

        def ordenaXfecha(self):
                # timestamp.sort(key=lambda x: time.strptime(x.time, '%Y-%m-%d %H:%M:%S')[0:6], reverse=True)
                self.registros.sort(key=lambda x: time.strptime(x.time, '%Y-%m-%d %H:%M:%S'), reverse=False);

        def imprime(self):
                estado=str(self.estados[int(self.registros[len(self.registros)-1].state)])
                linea=self.registros[0].tn+"; "+ self.registros[0].title + "; " + estado +"; "
                print linea,
                #print '{0}; {1}; '.format(self.registros[0].tn, self.registros[0].title, estado;
                for i in range(len(self.colas)):
                        print '{0}; '.format(str(datetime.timedelta(seconds=self.tiempos[i]))),
                print

        def calcula(self, fechaFin):
                for i in range (len(self.registros)):
                        if i+1 < len(self.registros):
                                self.tiempos[int(self.registros[i].queue)]+= (self.registros[i+1].timetoseconds() - self.registros[i].timetoseconds());
                estadoFinal=int(self.registros[len(self.registros)-1].state)
                #if estadoFinal==4 or estadoFinal==7 or estadoFinal==8 or estadoFinal==9:
                if not (estadoFinal==2 or estadoFinal==10 or estadoFinal==3 or estadoFinal==6):
                        fF=fechaFin=time.mktime(time.strptime(fechaFin,'%Y-%m-%d %H:%M:%S'))
                        self.tiempos[int(self.registros[len(self.registros)-1].queue)]+= fF - (self.registros[len(self.registros)-1].timetoseconds());
                elif estadoFinal==6:
                        fF=fechaFin=time.mktime(time.strptime(fechaFin,'%Y-%m-%d %H:%M:%S'))
                        self.tiempos[len(self.tiempos)-1]+= fF - (self.registros[len(self.registros)-1].timetoseconds());

        def cabecera(self):
                print "TN; Title; EstadoFinal; ",
                for cola in self.colas:
                        print "{0}; ".format(cola),
                print

        def exportaCSVcabecera(self, fechaIni, fechaFin):
                #file="/home/cenages/scripts/salida/salida_"+fechaIni+"_"+fechaFin+".csv"
                file="salida_"+fechaIni+"_"+fechaFin+".csv"
                f= open(file,'w');
                try:
                        linea="TN; Title; EstadoFinal; "
                        for cola in self.colas:
                                linea=linea+cola+"; "
                        linea=linea+"\n"
                        f.write( linea );
                finally:
                        f.close()

        def exportaCSV(self, fechaIni, fechaFin):
                #file="/home/cenages/scripts/salida/salida_"+fechaIni+"_"+fechaFin+".csv"
                file="salida_"+fechaIni+"_"+fechaFin+".csv"
                f= open(file,'a');
                try:
                        estado=self.estados[int(self.registros[len(self.registros)-1].state)]
                        linea=self.registros[0].tn+"; "+ self.registros[0].title+"; "+ estado
                        for i in range(len(self.colas)):
                                tiempo=str(datetime.timedelta(seconds=self.tiempos[i]))
                                linea=linea+"; "+tiempo
                        linea=linea+";\n"
                        f.write( linea );
                finally:
                        f.close()



# guarda la lista de tickets del fichero. Cada ticket tiene un registro por cada cambio de estado/cola.
tickets = []
if len(sys.argv)!=5:
	print "Usage:", sys.argv[0]," fecha_inicio fecha_fin fichero_datos fichero_colas"
	sys.exit(1);

fechaInicio=str(sys.argv[1])+" 0:00:00"
fechaFin=str(sys.argv[2])+" 0:00:00"
#fechaInicio=time.mktime(time.strptime(arg1,'%Y-%m-%d %H:%M:%S'))
#fechaFin=time.mktime(time.strptime(arg2,'%Y-%m-%d %H:%M:%S'))

#lista de colas definidas en el sistema.
with open(sys.argv[4]) as fcolas:
	colas = fcolas.readlines()

f= open(sys.argv[3],'r');
for linea in f:
		#para cada linea vemos si pertenece a uno de los tickets que ya hemos leido. Si es asi agregamos el registro, si no creamos un nuevo ticket. 
        tmp=Registro(linea,colas);
        tratado=False;
        for ticket in tickets:
                if ticket.registros[0].tn==tmp.tn:
                        ticket.append(tmp);
                        tratado=True;
        if not tratado:
                ticket=Ticket(colas);
                ticket.append(tmp);
                tickets.append(ticket);

ticket.cabecera();
ticket.exportaCSVcabecera(sys.argv[1], sys.argv[2])
for ticket in tickets:
        ticket.ordenaXfecha();
        ticket.calcula(fechaFin);
        ticket.imprime();
        ticket.exportaCSV(sys.argv[1], sys.argv[2]);

